静态库和 Framework

2018-5-8

静态库 .a 和 .framework

.a 是静态库

.framework 是 Apple 的一种库的格式,是一个特殊的文件夹,或者说是一个特殊的 bundle.

.a

.a 只能集成代码,不能集成资源,CocoaPods 用的就是 .a 的方式,代码用 .a 直接包含进工程最终生成的可执行文件中,资源文件复制到工程的 bundle 里面。使用 .a 库,在最后生成的 App 中,不能直接看到 App 使用了哪些库。

.a 在使用时,需要另外有 .h 头文件,可以根据情况只导入需要的 .h 文件。

.framework

.framework 可以集成代码与资源,在生成的 App 的 bundle 中直接体现用到了哪些 framework

.framework 在使用时,通常都是只导入 framework 的头文件,这个 framework 的头文件里面直接导入所有这个 framework 所提供的功能的对应头文件。

写这些主要是今天遇到个问题,在使用 .framework 的方式提供多个工程都需要的资源文件和代码时,导入头文件的时候会吧 .framework 所有对外开放的头文件都导入,这样做会不会有什么问题。

Apple 给的答案是,别担心,没问题,使用 .framework 不会使主程序变得臃肿,因为 .framework 是与主程序分开存放的,在运行时加载到内存中,从 bundle 目录结构也可以看出来这一点。.framework 的头文件只会编译一次,在以后的编译中也不会重新编译,除非有新的 framework 加入,所以也不用担心编译速度的问题。

既然说 .framework 是在运行时动态加载到内存的,.framework 就是动态库了,但是由于 ios 不支持动态库,所以 ios 上的 framework 是可以做成静态的,具体的就先不深究了。

Import all headers through a single header?